一、增删改查
定义接口
1 2 3 4 5 6 7 8 9
| public interface EmployeeMapper { public Employee getEmpById(Integer id); public void addEmp(Employee employee); public void updateEmp(Employee employee); public void deleteEmpById(Integer id); }
|
定义SQL映射文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| parameterType:可以省略 --> <insert id="addEmp" parameterType="com.glemontree.mybatis.bean.Employee"> insert into tbl_employee(last_name, email, gender) values( #{lastName}, #{email}, #{gender} ) </insert> <update id="updateEmp"> update tbl_employee set last_name = #{lastName}, email = #{email}, gender = #{gender} where id = #{id} </update> <delete id="deleteEmpById"> delete from tbl_employee where id = #{id} </delete>
|
使用#{}
的方式从传入的Employee对象中取属性!
定义测试文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| @Test public void test03() throws IOException { SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class); mapper.addEmp(employee);*/ mapper.updateEmp(employee);*/ mapper.deleteEmpById(2); openSession.commit(); } finally { openSession.close(); } }
|
这里需要的是SqlSessionFactory的openSession()方法有两种形式,第一种是不带参数,此时在执行增删改的时候需要手动提交数据,也即上面代码的
第二种是带参数,该参数的含义是是否自动提交数据,如果设置为true,那么在执行增删改的时候不需要自己再去执行上面这行代码。
另外,MyBatis允许增删改直接定义以下类型的返回值:Integer、Long、Boolean。如果返回值为Boolean,此时在执行增删改的时候如果影响了0行以上,就会返回true,否则返回false。如果返回值为Integer或者Long,那么返回的就是影响了数据库中多少行的数据。
二、insert获取自增主键的值
原生的JDBC是支持获取自增主键的值的,使用statement.getGeneratedKeys()方法,MyBatis也支持自增主键,自增主键的获取也是利用statement.getGeneratedKeys()方法,我们需要设置<insert>
标签的useGeneratedKeys="true"
属性,表示使用自增主键值获取主键值策略,同时设置<insert>
标签的keyProperty
属性指定对应的主键属性,也就是MyBatis获取到主键值以后将主键值封装给JavaBean的哪个属性,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| parameterType:可以省略 MySQL支持自增主键,自增主键的获取,MyBatis也是利用Statement.getGeneratedKeys()方法 useGeneratedKeys="true":使用自增主键值获取主键值策略 keyProperty="":指定对应的主键属性,也就是MyBatis获取到主键值以后将主键值封装给JavaBean的哪个属性 --> <insert id="addEmp" parameterType="com.glemontree.mybatis.bean.Employee" useGeneratedKeys="true" keyProperty="id"> insert into tbl_employee(last_name, email, gender) values( #{lastName}, #{email}, #{gender} ) </insert>
|
三、insert Oracle使用序列生成主键
Oracle不支持自增,但是Oracle使用序列来模拟自增,每次插入的数据的主键是从序列中取出的值。在Oracle中可以使用下面的语句查看当前用户的序列,last_number表示当前值。
1
| select * from user_sequences;
|
因此Oracle在插入数据时首先从序列中查出下一个将要使用的序列的值:
1
| select EMPLOYEE_SEQ.nextval from dual;
|
然后再执行插入操作:
1
| insert into employees(EMPLOYEE_ID, LAST_NAME, EMAIL) values(xxx, 'admin', 'admin@gmail.com'); // xxx表示上一步中使用sql语句获取到的序列中的值
|
这样在映射文件中可以这样写:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <insert id="addEmp" databaseId="oracle"> keyProperty表示将查出的主键值封装给JavaBean的哪个属性 order="BEFORE":当前SQL在插入SQL之前执行 resultType="":查出的数据的类型 --> <selectKey keyProperty="id" order="BEFORE" resultType="Integer"> select EMPLOYEE_SEQ.nextval from dual; </selectKey> insert into employees(EMPLOYEE_ID, LAST_NAME, EMAIL) values(#{id}, #{lastName}, #{email}); </insert>
|
在上面的这段代码中需要注意,使用<selectKey>
标签在插入语句执行之前获取主键值,其keyProperty
属性表示将查出的主键值封装给JavaBean的哪个属性,order
属性表示当前SQL语句在插入SQL语句之前执行,而resultType
属性则表示查出的数据的类型。